
//用于创建分配器函数的内部函数。

//用于创建分配器函数的内部函数。
export type Io = {
  [key in number | string | symbol]: any
}

export function createAssigner<T>(keysFunc: Function, defaults?: T) {
  return function (obj, ...arg): Io {
    var length = arg.length
    if (defaults) {
      obj = Object(obj)
    }
    if (length < 1 || obj == null) {
      return obj
    }
    for (const index in arg) {
      var source = arguments[index]
      var keys = keysFunc(source)
      var l = keys.length
      for (var i = 0; i < l; i++) {
        var key = keys[i]
        if (!defaults || obj[key] === void 0) {
          obj[key] = source[key]
        }
      }
    }
    return obj
  }
}

// 类似于 extend, 但只复制自己的属性覆盖到目标对象。（注：不包括继承过来的属性）。
//在传入的对象中为给定的对象分配所有自己的属性。
const extendOwn = createAssigner(Object.keys)
export const assign = createAssigner(Object.keys)

export default extendOwn
